package com.demarc.pesquisas.web.mb;

import java.io.Serializable;
import java.util.Locale;
import java.util.Stack;

import javax.annotation.PostConstruct;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import com.demarc.pesquisas.infraestrutura.mensagem.Mensagem;
import com.demarc.pesquisas.infraestrutura.persistencia.Filtro;
import com.demarc.pesquisas.infraestrutura.web.jsf.JsfUtil;
import com.demarc.pesquisas.negocio.util.ConstantesMensagens;
import com.demarc.pesquisas.web.pagina.OperacaoEnum;

public abstract class AbstractMB implements Serializable {

    protected Filtro filtro;
    protected OperacaoEnum operacao;
    protected Stack<String> historicoPaginas;

    @PostConstruct
    public void construirPagina() {
        inicializarPagina();
    }

    public AbstractMB() {
        // Construtor default
    }

    public abstract String getTituloPagina();

    /**
     * Inicializa atributos do MB
     */
    public abstract void inicializarPagina();

    /**
     * Redireciona o usuário para uma página correspondente a url passada.
     * 
     * @param url url da página.
     * 
     * @return página a ser redirecionada.
     */
    public String avancarParaPagina(String pagina) {
        return JsfUtil.avancarParaPagina(pagina);
    }

    protected void adicionarMensagemInfo(String labeFuncionalidade) {
        JsfUtil.adicionarMensagemInfo(new Mensagem(ConstantesMensagens.GERAL_OPERACAO_SUCESSO,
                operacao.getChavePropertiesOperacao(), labeFuncionalidade));
    }

    /**
     * Recupera a URL da pagina atual
     * 
     * @return url da pagina atual
     */
    protected String recuperarUrlPaginaAtual() {
        HttpServletRequest httpRequest =
                (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                        .getRequest();

        String paginaAtual =
                httpRequest.getRequestURI().replaceFirst(httpRequest.getContextPath(), "");

        return paginaAtual;
    }

    protected String recuperarContexto() {
        return ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                .getRequest()).getContextPath();
    }

    protected String getTituloPagina(String nomeFuncionalidade) {
        return JsfUtil.getTituloPagina(operacao, nomeFuncionalidade);
    }

    public boolean isEditavel() {
        return OperacaoEnum.isEditavel(operacao);
    }

    public boolean isInclusao() {
        return OperacaoEnum.isInclusao(operacao);
    }

    public boolean isAlteracao() {
        return OperacaoEnum.isAlteracao(operacao);
    }

    public boolean isExclusao() {
        return OperacaoEnum.isExclusao(operacao);
    }

    public boolean isDetalhe() {
        return OperacaoEnum.isDetalhe(operacao);
    }

    public boolean isListagem() {
        return OperacaoEnum.isListagem(operacao);
    }

    /**
     * Retorna o locale do browser.
     * 
     * @return o locale do browser.
     */
    protected Locale getLocale() {
        return FacesContext.getCurrentInstance().getViewRoot().getLocale();
    }

    public Filtro getFiltro() {
        return filtro;
    }

    public void setFiltro(Filtro filtro) {
        this.filtro = filtro;
    }

    public OperacaoEnum getOperacao() {
        return operacao;
    }

    public void setOperacao(OperacaoEnum operacao) {
        this.operacao = operacao;
    }
}